package Form;

import java.util.HashMap;
import javax.servlet.http.HttpServletRequest;

import CodeAdmin.Code;
import Creche.Admin.Administrateur;
import Creche.Bd.BD;

public final class InscriptionForm {
	
	private static final String CHAMP_CODE = "code";
	private static final String CHAMP_EMAIL = "email";
    private static final String CHAMP_NOM = "identifiant";
    private static final String CHAMP_PASS = "motdepasse";
    private static final String CHAMP_CONF = "confirmation";
    private static final String CHAMP_VILLE = "ville";
    
    private String resultat;
    private boolean inscrit;
    private HashMap<String,String> erreurs = new HashMap<String,String>();
    
    /**
     * @return le resultat du formulaire
     */
    public String getResultat() {
        return resultat;
    }
    
    
    /**
     * @return vrai si un administrateur est déjà inscrit
     */
    public boolean getInscrit() {
    	return inscrit;
    }
    
    
    /**
     * @return la map des erreurs saisis dans le formulaire
     */
    public HashMap<String,String> getErreurs() {
        return erreurs;
    }
    
    
    /**
     * Inscrit un administrateur après validation du formulaire 
     * @param requette de la servlet
     * @return administrateur
     */
    public Administrateur inscrireAdmin(HttpServletRequest req) {
    	
    	String code = req.getParameter(CHAMP_CODE).trim();
    	String email = req.getParameter(CHAMP_EMAIL).trim();
        String identifiant = req.getParameter(CHAMP_NOM).trim();
        String motDePasse = req.getParameter(CHAMP_PASS).trim();
        String confirmation = req.getParameter(CHAMP_CONF).trim();
        String ville = req.getParameter(CHAMP_VILLE).trim();
     
        BD myBD = new BD();
        Administrateur admin = new Administrateur("key");
        
        
        /* Validation du champ code */
        try {
        	Code codeBD = validationCode(code,myBD);
            admin.setStatut(codeBD.getStatut());
        } catch (Exception e) {
            setErreur(CHAMP_CODE, e.getMessage());
        }
        
        
        /* Validation du champ email */
        try {
            validationEmail(email);
            admin.setEmail(email);
            admin.setKey(email);
        } catch (Exception e) {
            setErreur(CHAMP_EMAIL, e.getMessage());
        }
        
        
        /* Validation du champ identifiant */
        try {
            validationIdentifiant(identifiant);
            admin.setIdentifiant(identifiant);
        } catch (Exception e) {
            setErreur(CHAMP_NOM, e.getMessage());
        }
     
        
        /* Validation des champs mot de passe et confirmation */
        try {
            validationMotsDePasse(motDePasse, confirmation);
            admin.setMotDePasse(motDePasse);
        } catch (Exception e) {
            setErreur(CHAMP_PASS, e.getMessage());
        }
     
        
        /* Validation du champ confirmation */
        try {
            validationConf(confirmation);
        } catch (Exception e) {
            setErreur(CHAMP_CONF, e.getMessage());
        }
        
        
        /* Validation du champ ville */
        try {
            validationVille(ville);
            admin.setVille(ville);
        } catch (Exception e) {
            setErreur(CHAMP_VILLE, e.getMessage());
        }
        
        inscrit = myBD.canRegisterAdmin(admin);
        
        /* Initialisation du résultat global de la validation */
        if (erreurs.isEmpty() && !inscrit) {
        	myBD.removeCode(code);
        	myBD.estPersistent(admin);
        } 
        else if (erreurs.isEmpty() && inscrit) {
        	resultat = "Échec : Vous êtes déjà inscrit";
        } 
        else {
            resultat = "Échec de l'inscription";
        }
     
        return admin;
    }
    
    
    /**
     * Crée un message d'erreur si code invalide ou non saisi et
     * en cas de succès retourne le code en bd
     * @param code saisi par l'utilisateur
     * @param base de données
     */
    private Code validationCode(String code, BD myBD) throws Exception {
        if (!code.isEmpty()) {
        	Code codeBD = myBD.getCode(code);
        	
            if (codeBD == null) throw new Exception("Code erroné");
            else return codeBD;
        } 
        else {
        	throw new Exception("Veuillez saisir le code admin");
        }
    }
    
    
    /**
     * Crée un message d'erreur si email invalide ou non saisi
     * @param email saisi par l'utilisateur
     */
    private void validationEmail(String email) throws Exception {
        if (!email.isEmpty()) {
            if (!email.matches( "([^.@]+)(\\.[^.@]+)*@([^.@]+\\.)+([^.@]+)" )) {
                throw new Exception("Adresse email invalide");
            }
        } 
        else {
            throw new Exception("Veuillez saisir une adresse email");
        }
    }
    
    
    /**
     * Crée un message d'erreur si le nom contient moins de 4 caractères
     * ou si il n'a pas été saisi
     * @param identifiant saisi par l'utilisateur 
     */
    private void validationIdentifiant(String nom) throws Exception {
        if (!nom.isEmpty()) {
        	if (nom.length() < 4) {
        		throw new Exception("Le nom doit contenir au moins 4 caractères");
        	}
        }
        else {
            throw new Exception("Veuillez saisir un identifiant");
        }
    }
    
     
    /**
     * Crée un message d'erreur si les mots de passe saisis sont différents ou
     * si le mot de passe et/ou la confirmation du mdp font moins de 4 caractères ou
     * si le mot de passe n'est pas saisi
     * 
     * @param mot de passe saisi par l'utilisateur
     * @param confirmation du mdp saisi par l'utilisateur
     */
    private void validationMotsDePasse(String motDePasse, String confirmation) 
    		throws Exception {
    	if ((!motDePasse.isEmpty()) && (!confirmation.isEmpty())) {
            if (!motDePasse.equals(confirmation)) {
                throw new Exception("Les mots de passe entrés sont différents");
            } 
            else if (motDePasse.length() < 4) {
                throw new Exception("Le mot de passe doit contenir au moins 4 caractères");
            }
        }
    	else {
    		if ((!motDePasse.isEmpty()) && (motDePasse.length() < 4)) {
                throw new Exception("Le mot de passe doit contenir au moins 4 caractères");
    		}
    		else {
    			throw new Exception("Veuillez saisir votre mot de passe");
    		}
    	}
    }
    
    
    /**
     * Crée un message d'erreur si la confirmation du mdp n'a pas été saisi
     * @param confirmation du mdp saisi par l'utilisateur
     */
    private void validationConf(String confirmation) throws Exception {
        if (confirmation.isEmpty()) {
            throw new Exception("Veuillez confirmer votre mot de passe");
        }
    }
    
    
    /**
     * Crée un message d'erreur si ville non choisie
     * @param ville choisie par l'utilisateur
     */
    private void validationVille(String ville) throws Exception {
        if (ville.isEmpty()) {
            throw new Exception("Veuillez choisir une ville");
        }
    }
    
    
    /**
     * Ajoute dans la map des erreurs le message correspondant au champ
     * @param champ du formulaire
     * @param message d'erreurs
     */
    private void setErreur(String champ, String message) {
        erreurs.put(champ, message);
    }
}
